from typing import Optional
from sqlalchemy.orm import Session
from database import get_db
from models import Config


class ConfigData:
    """配置工具类：通过 field 从数据库获取配置值"""

    @staticmethod
    def get_value(field: str, default: Optional[str] = None) -> Optional[str]:
        """
        通过 field 获取配置项的 data 值
        :param field: 配置字段名（唯一）
        :param default: 默认值（如果找不到配置项则返回）
        :return: 配置值或默认值
        """
        db: Session = next(get_db())  # 获取数据库会话
        try:
            config = db.query(Config).filter(Config.field == field).first()
            if config:
                return config.data
            return default
        finally:
            db.close()

    # 用户分组 每日上限值
    @staticmethod
    def get_user_configs() -> dict:
        """获取用户类型配置（包含显示名称和每日调用限制）"""
        return {
            "free": {
                "label": "普通用户",
                "daily_limit": int(ConfigData.get_value('config_free_api', default='5'))
            },
            "month": {
                "label": "金牌用户",
                "daily_limit": int(ConfigData.get_value('config_month_api', default='2000'))
            },
            "season": {
                "label": "钻石用户",
                "daily_limit": int(ConfigData.get_value('config_season_api', default='5000'))
            },
            "year": {
                "label": "至尊用户",
                "daily_limit": int(ConfigData.get_value('config_year_api', default='10000'))
            },
            "admin": {
                "label": "管理员",
                "daily_limit": 999999  # 固定值，无需从数据库获取
            }
        }

    # 套餐配置
    @staticmethod
    def get_vip_plans():
        return {
            "month": {
                "daily_limit": int(ConfigData.get_value('config_month_api', default='2000')),
                "days": 30,
                "price": float(ConfigData.get_value('config_month_price', default='19.9'))
            },
            "season": {
                "daily_limit": int(ConfigData.get_value('config_season_api', default='5000')),
                "days": 180,
                "price": float(ConfigData.get_value('config_season_price', default='99.9'))
            },
            "year": {
                "daily_limit": int(ConfigData.get_value('config_year_api', default='10000')),
                "days": 365,
                "price": float(ConfigData.get_value('config_year_price', default='199.9'))
            }
        }

